package com.stream;

import java.time.*;
import java.time.chrono.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DecimalStyle;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.WeekFields;
import java.time.zone.ZoneRules;
import java.util.*;

/**
 * @Author:zxh
 * @Description: Date/time API test
 * @Date: 2020/11/3
 * @Modified By:
 */
public class DateTimeApiTest {
    /**
     *线程安全问题：java.util.Date是非线程安全的，所有的日期类都是可变的；
     设计很差：在java.util和java.sql的包中都有日期类，此外，用于格式化和解析的类在java.text包中也有定义。而每个包将其合并在一起，也是不合理的；
     时区处理麻烦：日期类不提供国际化，没有时区支持，因此Java中引入了java.util.Calendar和Java.util.TimeZone类；
     */
    public void dateTimeTest(){
        long currentTimeMillis = System.currentTimeMillis();
        TimeZone aDefault = TimeZone.getDefault();

        Clock clock = Clock.systemUTC();
        Instant instant = clock.instant();
        System.out.println("instant:"+instant.toString());

        LocalDate localDate = LocalDate.now();
        System.out.println("localDate: "+localDate.toString());

        LocalTime localTime = LocalTime.now();
        System.out.println("localTime:"+localTime);

        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println(now.toString());
    }

    public static void testAfter(){
        LocalDateTime date = LocalDateTime.parse("2017-02-03T12:30:30");
        LocalDateTime date1 = LocalDateTime.parse("2017-03-03T12:30:30");
        System.out.println("易百教程："+date.isBefore(date1));//原文出自【易百教程】，商业转载请联系作者获得授权，非商业请保留原文链接：https://www.yiibai.com/javatime/javatime_localdatetime_isafter.html


    }

    public static void main(String[] args) {
        DateTimeApiTest.testAfter();
//        new DateTimeApiTest().dateTimeTest();
//        ChronoLocalDate.timeLineOrder();
//        ChronoLocalDateTime.timeLineOrder();
//        ChronoZonedDateTime.timeLineOrder();
//        Chronology.getAvailableChronologies();
//        Era.class.getFields();
//        ChronoPeriod.class.getFields();
//        DateTimeFormatter.ofPattern("2019");
//        DateTimeFormatter.ofPattern("2020");
//        DecimalStyle.ofDefaultLocale();
//
//        ZoneRules.class.getFields();
//        ZoneOffset.of("23");
//
//        TemporalAccessor.class.getFields();
//        WeekFields.ISO.dayOfWeek();

        //LocalDate parse = LocalDate.from()parse("20160715");
        LocalDate yyyyMMdd1 = LocalDate.parse("20160715", DateTimeFormatter.ofPattern("yyyyMMdd"));
        String yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd").format(yyyyMMdd1.minusYears(1));
        System.out.printf(yyyyMMdd.toString());

        String creditRatingAgency = "";
        String[] str = new String[] {"1","12"};
        System.out.println(str);
        String format = String.format("SELECT id,status,customer_code from t_customer WHERE  organization_id = %s or customer_name = %s", "2", "3");
        System.out.println("输出："+format);

        List<String> issuanceInfoDTOList = new ArrayList<>();//Collections.emptyList();
        System.out.println("wo:"+issuanceInfoDTOList);

        LocalDate.parse(creditRatingAgency == null?"":creditRatingAgency,java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"));


    }
    /**
     * Java8还在其他细节上也做出了改变，归纳如下：

     之前的版本，注解在同一个位置只能声明一次，而Java8版本中提供@Repeatable注解，来实现可重复注解；
     String类中提供了join方法来完成字符串的拼接；
     在Arrays上提供了并行化处理数组的方式，比如利用Arrays类中的parallelSort可完成并行排序；
     在Java8中在并发应用层面上也是下足了功夫：（1）提供功能更强大的Future：CompletableFuture；（2）StampedLock可用来替代ReadWriteLock；（3）性能更优的原子类：：LongAdder,LongAccumulator以及DoubleAdder和DoubleAccumulator；
     编译器新增一些特性以及提供一些新的Java工具
     */
    /**
     * Instant是最接近的相当类别java.util.Date 。 ZonedDateTime是最接近等价类java.util.GregorianCalendar 。
     */
    /**
     1.LocalDate存储没有时间的日期。 它存储一个像“2010-12-03”这样的日期，可以用来存储一个生日。
     2.LocalTime存储没有日期的时间。 这样可以储存一个像“11：30”这样的时间，可以用来存储一个开或关的时间。
     3.LocalDateTime存储日期和时间。 这样可以存储像2010-12-03T11：30这样的日期。
     4.ZonedDateTime存储具有时区的日期和时间。 如果您想要考虑到ZoneId （如“欧洲/巴黎”）的日期和时间的精确计算，这是有用的。 在可能的情况下，建议在没有时区的情况下使用更简单的类。 时区的广泛使用往往会增加应用程序的相当大的复杂性
     */
    /**
     * Instant
     * Java时间标度用于所有日期时间类。 这包括Instant ， LocalDate ， LocalTime ， OffsetDateTime ， ZonedDateTime和Duration 。
     */
}
